package com.company;

public class LinkedListStack<E> implements Stack<E> {
    private LinkedList<E> list;

    public LinkedListStack() {
        list = new LinkedList<>();
    }

    @Override
    public void push(E e) {
        list.addFirst(e);
    }

    @Override
    public E pop() {
        return list.removeFirst();
    }

    @Override
    public E peek() {
        return list.getFirst();
    }

    @Override
    public int getSize() {
        return this.list.getSize();
    }

    @Override
    public boolean isEmpty() {
        return this.list.isEmpty();
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("Stack: top ");
        res.append(list);
        return res.toString();
    }

    public static void main(String[] args) {
        LinkedListStack<Integer> linkedListStack = new LinkedListStack<>();
        for (int i = 0; i < 5; i++) {
            linkedListStack.push(i);
            System.out.println(linkedListStack);
        }
        //数组栈
        //链表栈
        //链表实现
        //数组去实现栈
        //testStack
        // 进行测试
        // 数组
        // 栈
        // 队列
        // 动态链表
        // 动态数组
        // 插入
        // 二分法排序由
        //选择
        //数组需要 resize 动态扩容
        // 进行设计的空间和时间 JVM版本方式
        //空间 new 重新 new node new node new node
        //耗时很多 10000000 可以看出来 new
        //在new 在什么方式 测试性能 ArrayStack LinkedListStack
        //ArrayLiknedStack
        //ArrayQueue
        //DeDoubleEniponit
        // object 过多
        // 循环队列 数据结构实现的方法的改进
        //时间复杂度 是一样的 不会 1000-2000 倍差距即可
        //链表实现队列
        //链表的时间复杂度 分析 队列 一段 fist last
        // on o1
        //数组也是如此 改进数组队列-循环队列 循环链表 单链表 双向链表
        //虚拟 表头 head tail 尾部 头部 尾部
        //待删除的元素 tail 那个节点
        //o1
        // head
        // tail 插入元素
        // head 删除元素
        //队尾
        //队首 删除
    }
}
